import pandas as pd
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
import os

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 模拟生成保险业务数据
def generate_insurance_data():
    np.random.seed(42)
    companies = ['公司A', '公司B', '公司C', '公司D', '公司E']
    periods = ['基期', '报告期']

    data = []
    for company in companies:
        for period in periods:
            row = {
                '公司名称': company,
                '报告期': period,
                '原保费收入': np.random.uniform(1e6, 1e8),
                '分保费收入': np.random.uniform(1e5, 1e7),
                '分出保费': np.random.uniform(1e4, 1e6),
                '首年原保费收入': np.random.uniform(1e5, 1e7),
                '首年分保费收入': np.random.uniform(1e4, 1e6),
                '长期人身险有效保单数量_期初': np.random.randint(1000, 10000),
                '长期人身险有效保单数量_期末': np.random.randint(800, 9500),
                '个人营销渠道新单件数': np.random.randint(100, 5000),
                '标准保费': np.random.uniform(1e5, 1e7),
                '营销员数量_期初': np.random.randint(50, 500),
                '营销员数量_期末': np.random.randint(50, 500),
                '所有者权益_期初': np.random.uniform(1e7, 1e9),
                '所有者权益_期末': np.random.uniform(1e7, 1e9),
                '市场总原保费收入': np.random.uniform(1e8, 1e10),
                '市场总分保费收入': np.random.uniform(1e7, 1e9)
            }
            data.append(row)

    df = pd.DataFrame(data)
    return df


# 生成并保存可视化图表
def generate_and_save_visualizations(df, output_dir='output_plots'):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 1. 原保费收入市场份额饼图
    plt.figure(figsize=(8, 6))
    df.set_index('公司名称')['原保费收入市场份额'].plot.pie(autopct='%1.1f%%')
    plt.title('各公司原保费收入市场份额')
    plt.savefig(f'{output_dir}/市场份额.png', bbox_inches='tight')
    plt.show()
    plt.close()

    # 2. 增长率柱状图
    plt.figure(figsize=(10, 6))
    df[['公司名称', '原保费收入增长率', '分保费收入增长率']].set_index('公司名称').plot.bar()
    plt.title('原/分保费收入增长率对比')
    plt.ylabel('增长率(%)')
    plt.savefig(f'{output_dir}/增长率对比.png', bbox_inches='tight')
    plt.show()
    plt.close()

    # 3. 13个月续保率柱状图
    plt.figure(figsize=(8, 6))
    df.set_index('公司名称')['13个月续保率'].plot.bar(color='green')
    plt.title('各公司13个月续保率')
    plt.ylabel('续保率(%)')
    plt.savefig(f'{output_dir}/续保率.png', bbox_inches='tight')
    plt.show()
    plt.close()

    # 4. 自留保费占净资产比雷达图
    plt.figure(figsize=(8, 8))
    categories = df['公司名称'].values
    values = df['自留保费占净资产比'].values
    N = len(categories)

    angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist()
    values = np.concatenate((values, [values[0]]))
    angles += angles[:1]

    ax = plt.subplot(111, polar=True)
    ax.plot(angles, values, 'o-', linewidth=2)
    ax.fill(angles, values, alpha=0.25)
    ax.set_thetagrids(np.degrees(angles[:-1]), categories)
    ax.set_title('自留保费占净资产比雷达图(%)', y=1.1)
    plt.savefig(f'{output_dir}/自留保费雷达图.png', bbox_inches='tight')
    plt.show()
    plt.close()


# 计算所有业务指标
def calculate_metrics(df):
    # 合并基期和报告期数据
    base_df = df[df['报告期'] == '基期'].set_index('公司名称')
    report_df = df[df['报告期'] == '报告期'].set_index('公司名称')

    # 计算自留保费
    base_df['自留保费'] = base_df['原保费收入'] - base_df['分出保费']
    report_df['自留保费'] = report_df['原保费收入'] - report_df['分出保费']

    # 1. 原/分保费收入增长率
    report_df['原保费收入增长率'] = (report_df['原保费收入'] - base_df['原保费收入']) / base_df['原保费收入'] * 100
    report_df['分保费收入增长率'] = (report_df['分保费收入'] - base_df['分保费收入']) / base_df['分保费收入'] * 100

    # 2. 自留保费增长率
    report_df['自留保费增长率'] = (report_df['自留保费'] - base_df['自留保费']) / base_df['自留保费'] * 100

    # 3. 原/分保费收入市场份额
    report_df['原保费收入市场份额'] = report_df['原保费收入'] / report_df['市场总原保费收入'] * 100
    report_df['分保费收入市场份额'] = report_df['分保费收入'] / report_df['市场总分保费收入'] * 100

    # 4. 原/分保费收入增量市场份额
    market_orig_growth = report_df['原保费收入'].sum() - base_df['原保费收入'].sum()
    market_reins_growth = report_df['分保费收入'].sum() - base_df['分保费收入'].sum()

    report_df['原保费收入增量市场份额'] = (report_df['原保费收入'] - base_df['原保费收入']) / market_orig_growth * 100
    report_df['分保费收入增量市场份额'] = (report_df['分保费收入'] - base_df['分保费收入']) / market_reins_growth * 100

    # 5. 发展系数
    report_df['原保费发展系数'] = report_df['原保费收入增量市场份额'] / report_df['原保费收入市场份额']
    report_df['分保费发展系数'] = report_df['分保费收入增量市场份额'] / report_df['分保费收入市场份额']

    # 6. 首年保费与保费收入比
    report_df['首年原保费与保费收入比'] = report_df['首年原保费收入'] / report_df['原保费收入'] * 100
    report_df['首年分保费与保费收入比'] = report_df['首年分保费收入'] / report_df['分保费收入'] * 100

    # 7. 13个月续保率
    report_df['13个月续保率'] = report_df['长期人身险有效保单数量_期末'] / base_df['长期人身险有效保单数量_期初'] * 100

    # 8. 个人营销渠道的件均保费
    report_df['个人营销渠道件均保费'] = report_df['首年原保费收入'] / report_df['个人营销渠道新单件数']

    # 9. 标准保费增长率
    report_df['标准保费增长率'] = (report_df['标准保费'] - base_df['标准保费']) / base_df['标准保费'] * 100

    # 10. 人均保费
    report_df['平均营销员数量'] = (report_df['营销员数量_期初'] + report_df['营销员数量_期末']) / 2
    report_df['人均保费'] = report_df['首年原保费收入'] / report_df['平均营销员数量']

    # 11. 自留保费占净资产比
    report_df['平均所有者权益'] = (report_df['所有者权益_期初'] + report_df['所有者权益_期末']) / 2
    report_df['自留保费占净资产比'] = report_df['自留保费'] / report_df['平均所有者权益'] * 100

    # 选择需要的列作为结果
    result_columns = [
        '公司名称', '原保费收入增长率', '分保费收入增长率', '自留保费增长率',
        '原保费收入市场份额', '分保费收入市场份额',
        '原保费收入增量市场份额', '分保费收入增量市场份额',
        '原保费发展系数', '分保费发展系数',
        '首年原保费与保费收入比', '首年分保费与保费收入比',
        '13个月续保率', '个人营销渠道件均保费',
        '标准保费增长率', '人均保费', '自留保费占净资产比'
    ]

    # 重置索引并添加公司名称列
    result_df = report_df.reset_index()
    result_df['公司名称'] = result_df['公司名称']

    return result_df[result_columns]


# 打印漂亮的表格
def print_pretty_table(df):
    from tabulate import tabulate
    print(tabulate(df, headers='keys', tablefmt='grid', showindex=False, floatfmt=".2f"))


# 主程序
def main():
    # 生成模拟数据
    print("正在生成模拟数据...")
    insurance_data = generate_insurance_data()

    # 计算业务指标
    print("\n正在计算业务指标...")
    metrics_result = calculate_metrics(insurance_data)

    print("=== 各公司业务指标 ===")
    print_pretty_table(metrics_result)
    # 生成并显示可视化图表
    print("\n正在生成可视化图表...")
    generate_and_save_visualizations(metrics_result.copy())

    # 导出Excel
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    output_file = f'八维保险数据挖掘结果_{timestamp}.xlsx'
    metrics_result.to_excel(output_file, index=False, float_format="%.2f")

    print(f"\n数据结果已保存到: {output_file}")
    print("可视化图表已保存到: output_plots/ 目录")


if __name__ == "__main__":
    main()